package web;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import service.CategoriaTransacaoService;
import service.ContaService;
import service.ManutencaoService;
import util.UtilColecao;
import util.UtilMensagem;
import entity.CategoriaTransacao;
import entity.Conta;
import enumeration.TipoCategoriaEnum;
import enumeration.TipoContaEnum;

@Controller
@Scope("view")
public class ManterContaMB extends ManutencaoCRUDBean<Conta> implements
	Serializable {

    private static final long serialVersionUID = 7863504781978243773L;

    @Autowired
    private ContaService contaService;

    @Autowired
    private CategoriaTransacaoService categoriaTransacaoService;

    private List<Conta> listaContas;

    private TipoContaEnum tipoConta;

    private CategoriaTransacao categoriaTransacao;

    private String tipoCategoria;

    private Conta conta;

    private TipoCategoriaEnum tipoCategoriaEnum;

    private List<CategoriaTransacao> subList2;

    private List<CategoriaTransacao> listaHijos;

    private List<CategoriaTransacao> listaMenus;

    private TreeNode treeCategoria = new DefaultTreeNode("Root", null);

    @Override
    public void inicializar() {
	carregarListaContas();

	listaMenus = categoriaTransacaoService.listarAtivos();
	recursivo(listaMenus, 1, treeCategoria);
    }

    public void carregarListaContas() {
	listaContas = contaService.listarContasComSaldosCalculados();
    }

    private void carregarTreeCategoria() {
	final List<CategoriaTransacao> listaCategorias = categoriaTransacaoService
		.listarAtivos();

	final CategoriaTransacao root = new CategoriaTransacao();
	root.setListaCategoriasFilhas(listaCategorias);
	treeCategoria = newNodeWithChildren(root, null);
    }

    public TreeNode newNodeWithChildren(CategoriaTransacao ttParent,
	    TreeNode parent) {
	TreeNode newNode = new DefaultTreeNode(ttParent, parent);

	if (!UtilColecao.isColecaoVazia(ttParent.getListaCategoriasFilhas())) {
	    for (CategoriaTransacao tt : ttParent.getListaCategoriasFilhas()) {
		newNodeWithChildren(tt, newNode);
	    }
	}
	return newNode;
    }

    public void recursivo(List<CategoriaTransacao> liste, Serializable id,
	    TreeNode node) {
	subList2 = new ArrayList<CategoriaTransacao>();
	subList2 = subMenus(id);
	for (CategoriaTransacao k : subList2) {
	    TreeNode childNode = new DefaultTreeNode(k.getNome(), node);
	    recursivo(subList2, k.getId(), childNode);

	}

    }

    public List<CategoriaTransacao> subMenus(Serializable i) {
	listaHijos = new ArrayList<CategoriaTransacao>();
	for (CategoriaTransacao k : listaMenus) {
	    if (k.getCategoriaPai() == i) {
		listaHijos.add(k);
	    }
	}
	return listaHijos;
    }

    public void tipoContaAlterado() {
	prepararAdicionar();
    }

    public void doAdicionarCategoriaTransacaoAction() {
	doAdicionarCategoriaTransacaoAction(null);
    }

    public void doAdicionarCategoriaTransacaoAction(
	    CategoriaTransacao categoriaPaiIncluir) {

	tipoCategoriaEnum = null;
	if ("CREDITO".equalsIgnoreCase(tipoCategoria))
	    tipoCategoriaEnum = TipoCategoriaEnum.CREDITO;
	if ("DEBITO".equalsIgnoreCase(tipoCategoria))
	    tipoCategoriaEnum = TipoCategoriaEnum.DEBITO;

	categoriaTransacao = categoriaTransacaoService
		.criarCategoria(tipoCategoriaEnum);

	if (categoriaPaiIncluir != null) {
	    categoriaTransacao.setCategoriaPai(categoriaPaiIncluir);
	}
    }

    @Override
    protected void prepararAdicionar() {
	if (tipoConta == null) {
	    tipoConta = TipoContaEnum.BANCARIA;
	}
	conta = contaService.criarConta(tipoConta);
    }

    @Override
    public void doSalvarAction() {

	getEntidade().setTipoConta(getTipoConta());
	super.doSalvarAction();
    }

    public void doSalvarCategoriaAction() {
	categoriaTransacaoService.salvar(categoriaTransacao);
	addInfoMessage(UtilMensagem.getMensagem("MSG_0041"));

	carregarTreeCategoria();
    }

    @Override
    public ManutencaoService<Conta> getService() {
	return contaService;
    }

    @Override
    public Conta getEntidade() {
	return conta;
    }

    @Override
    public void setEntidade(Conta entidade) {
	conta = entidade;
    }

    public List<Conta> getListaContas() {
	return listaContas;
    }

    public TipoContaEnum getTipoConta() {
	return tipoConta;
    }

    public void setTipoConta(TipoContaEnum tipoConta) {
	this.tipoConta = tipoConta;
    }

    public CategoriaTransacao getCategoriaTransacao() {
	return categoriaTransacao;
    }

    public void setCategoriaTransacao(CategoriaTransacao categoriaTransacao) {
	this.categoriaTransacao = categoriaTransacao;
    }

    public String getTipoCategoria() {
	return tipoCategoria;
    }

    public void setTipoCategoria(String tipoCategoria) {
	this.tipoCategoria = tipoCategoria;
    }

    public TipoCategoriaEnum getTipoCategoriaEnum() {
	return tipoCategoriaEnum;
    }

    public void setTipoCategoriaEnum(TipoCategoriaEnum tipoCategoriaEnum) {
	this.tipoCategoriaEnum = tipoCategoriaEnum;
    }

    public TreeNode getTreeCategoria() {
	return treeCategoria;
    }

}
